package com.example.demo2;

import java.util.*;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        // 创建一个map集合存储用于的选择
        Map<String, List<String>> selects = new HashMap<>();
        List<String> data1 = new ArrayList<>();
        Collections.addAll(data1, "农家乐", "野外拓展", "轰趴");
        selects.put("张全蛋儿", data1);

        List<String> data2 = new ArrayList<>();
        Collections.addAll(data2, "轰趴", "野外拓展", "健身房");
        selects.put("李二狗子", data2);

        List<String> data3 = new ArrayList<>();
        Collections.addAll(data3, "野外拓展", "轰趴");
        selects.put("翠花", data3);

        List<String> data4 = new ArrayList<>();
        Collections.addAll(data4, "健身房");
        selects.put("小帅", data4);

        List<String> data5 = new ArrayList<>();
        Collections.addAll(data5, "农家乐");
        selects.put("有容", data5);

        selects.forEach((k, v) -> System.out.println(k + "-->" + v));
        System.out.println("----------------------------------------------");

        // 1.请找出每个去处想去的人数是多少,并输出投票最多的去处是哪个
        // 创建一个map集合键是去处的名称 值是该去地方有多少人投票
        Map<String, Integer> infos = new HashMap<>();
        for (List<String> value : selects.values()) {
            for (String s : value) {
                if (infos.containsKey(s)) {
                    // 说明已经出现过了次数加1
                    infos.put(s, infos.get(s) + 1);
                } else {
                    // 说明是第一次出现
                    infos.put(s, 1);
                }
            }
        }

        System.out.println("每个去想去的人数:");
        infos.forEach((k, v) -> System.out.println(k + "-->" + v + "人"));
        // infos.entrySet().stream().max((o1, o2) -> o1.getValue() - o2.getValue()).ifPresent(entry -> System.out.println("投票最多的去是" + entry.getKey()));
        // 简化之后的写法
        // infos.entrySet().stream().max(Comparator.comparingInt(Map.Entry::getValue)).ifPresent(entry -> System.out.println("投票最多的地方是：" + entry.getKey()));
        // 首先找出投票最多的去处
        // 使用Stream API找出投票数最多的去处
        Map.Entry<String, Integer> entry = infos.entrySet().stream().max(Comparator.comparingInt(Map.Entry::getValue)).get();
        // 将所有投票数与最高票数相同的去处的名字收集到一个列表中
        List<String> names = infos.entrySet().stream().filter(e -> e.getValue() == entry.getValue()).map(e -> e.getKey()).collect(Collectors.toList());
        // 输出投票最多的去处的名字列表
        System.out.println(names);

        // 2.请找出哪些人没有选择投票最多的去处,输出他们的名字
        // 提示没有投票最多的去处的信息
        System.out.println("没有投票最多的去是:");
        // 过滤出没有选择投票最多的去处的人,并输出他们的名字
        selects.entrySet().stream().filter(e -> {
            // 初始化标志变量为true,表示没有选择投票最多的去处
            boolean flag = true;
            // 遍历该人选择的去处列表
            for (String s : e.getValue()) {
                // 如果找到了投票最多的去处,则将标志变量设为false并中断循环
                if (names.contains(s)) {
                    flag = false;
                    break;
                }
            }
            // 返回标志变量的值,决定是否将该人包含在结果中
            return flag;
        }).forEach(e -> System.out.println(e.getKey()));
    }
}